#encoding: UTF-8
require "nokogiri"
require "open-uri"
require "date"


class Resfut
  attr_accessor :html_page, :html_base

  def initialize
    @html_page = 'http://www.marca.com/estadisticas/futbol/primera/'
    @html_base = 'http://www.marca.com/deporte/central-de-datos/futbol/'
    #ligas
    #liga_America
    caller
  end

  def caller
    path_links_america = "//ul[@class='submenu-americanas']/li/a/@href"
    path_links_america_title = "//ul[@class='submenu-americanas']/li/a/@title"
    collection_america = [3, 5, 6, 7, 8, 10, 11, 12, 13]

    ligas_crawler(path_links_america, path_links_america_title, collection_america, false)

    path_links_otras = "//ul[@class='submenu-otras']/li/a/@href"
    path_links_otras_title = "//ul[@class='submenu-otras']/li/a/@title"
    collection_otras = [1,4,7,8]

    ligas_crawler(path_links_otras, path_links_otras_title, collection_otras, true)

  end

  def ligas
    marcacom = Nokogiri::HTML(open(@html_page))
    #href ligas americanas
    ligaAmericaLinks = marcacom.xpath("//ul[@class='submenu-otras']/li/a/@href")
    #titulos ligas americanas
    ligaAmericaTitle = marcacom.xpath("//ul[@class='submenu-otras']/li/a/@title")

    ligaActual = Nokogiri::HTML(open(ligaAmericaLinks[8]))
    ligaActualNombre = ligaAmericaTitle[8] #OJOO!!!!!!!!!! Hardcode para que uruguay quede como la liga

    puts "Nombre #{ligaActualNombre}"

    cant =  ligaActual.xpath("//div[@class='archivo borde-caja']").size() #cantidad de campeonatos de una liga

    l = Liga.find_by_liga_nombre ligaActualNombre.to_s
    if l.nil?
      l = Liga.new();
      l.liga_nombre = ligaActualNombre.to_s
      l.save
    end
    #Para todos los campeonatos analzar la informacion
    for i in 0..(cant -1)
      temp = ligaActual.xpath("//div[@class='archivo borde-caja'][#{i+1}]/ul/li/small/a/@href")
      tempName = ligaActual.xpath("//div[@class='archivo borde-caja'][#{i+1}]/ul/li/small/a/text()")
      for j in 0..(temp.size()-1)
        #buscar si existe un campeonato tal que el nombre es temporada y conincide el id
        t = l.campeonatos.find_all{|c| c.nombre == "Temporada" && c.temporada_id == tempName[j].to_s}.first
        #si es nil busca si es de tipo apertura
        if t.nil?
          l.campeonatos.find_all{|c| c.nombre == "Apertura" && c.temporada_id == tempName[j].to_s}.first
        end
        #si es nil busca si es de tipo clausura
        if t.nil?
          l.campeonatos.find_all{|c| c.nombre == "Clausura" && c.temporada_id == tempName[j].to_s}.first
        end
        #si es nil entonces se crea
        if t.nil?
          t = Campeonato.new()
          if cant == 1
            t.nombre = "Temporada"
          elsif cant == 2 && i == 0
            t.nombre = "Apertura"
          else
            t.nombre = "Clausura"
          end
          #se asigna el id
          t.temporada_id = tempName[j].to_s
          t.liga = l;
          t.save
        end
        urlIndex = temp[j].to_s
        if ! (urlIndex.include? "www.marca.com"     )
          urlIndex = "http://www.marca.com" + urlIndex
        end
        begin
          equiposNoko = Nokogiri::HTML(open(urlIndex+"index.html"))
        rescue
          equiposNoko = Nokogiri::HTML(open(urlIndex))
        end

        equipos1 = equiposNoko.xpath("//div[@class = 'clasificacion']/table[@id ='clasificacion_completa']/tbody/tr/td[@class = 'equipo']/text()")
        equipos2 = equiposNoko.xpath("//table[@id='calsificacion_completa']/tbody/tr/td[@class = 'equipo']/text()")
        equipos = equipos1
        if equipos1.text == ""
          equipos = equipos2
        end
        equipos.each do |equipo|
          e = Equipo.find_by_equipo_nombre equipo.to_s
          if e.nil?
            e = Equipo.find_by_equipo_nombre equipo.text
          end
          if e.nil?
            e = Equipo.new()
            e.liga = l
            e.equipo_nombre = equipo.to_s
            e.liga_id = l.id
            e.save
            end
        end
        if (urlIndex.include?("index_nuevo.html"))
          urlIndex = urlIndex.sub("index_nuevo.html","")
        end
        crawler(t,urlIndex + "calendario.html")

      end
    end
  end

  def crawler (campeonato, urlCalendario)
    liga =  Nokogiri::HTML(open(urlCalendario))
    jornada_xpath = "//div[@class='jornada calendarioInternacional']"
    cant_jornadas = liga.xpath(jornada_xpath).size()  #Obtiene todas las jornadas de la liga
    for i in 0..(cant_jornadas-1) #Recorro todas las jornadas de la liga pasado por parametro
      partidos_xpath = "//div[@class='jornada calendarioInternacional'][#{i+1}]/table/tbody/tr"
      cant_partidos = liga.xpath(partidos_xpath).size() #Obtiene la cantidad de partidos de la jornada i

      fecha_jornada_xpath = "//div[@class='jornada calendarioInternacional'][#{i+1}]/table/thead/tr/th/text()"
      fecha_jornada = liga.xpath(fecha_jornada_xpath)  #Obtiene la fecha en que se jugo la jornada i+1

      if fecha_jornada.to_s == ""
        fecha_jornada = liga.xpath("//div[@class='jornada calendarioInternacional'][1]/table/thead/tr/th[@class = 'fnd2']/span/text()")  #Obtiene la fecha en que se jugo la jornada i+1
      end

      nueva_jornada = Jornada.find {|j| j.campeonato == campeonato && j.nro == i+1}

      if (nueva_jornada.nil?)
        nueva_jornada = Jornada.new
        nueva_jornada.campeonato = campeonato
        nueva_jornada.nro = i+1
        fechas = fecha_jornada.to_s.split("-")

        puts fechas.to_s

        if fechas.size == 2

          fecha_inicio = fechas[0].strip.split(".")
          fecha_fin = fechas[1].strip.split(".")

          if (fecha_inicio.size < 2)
            fecha_inicio = fechas[0].strip.gsub('(','').gsub(')','').split("/")
            fecha_fin = fechas[1].strip.gsub('(','').gsub(')','').split("/")
          end

          nueva_jornada.fecha_inicio = Date.new(fecha_inicio[2].to_i, fecha_inicio[1].to_i, fecha_inicio[0].to_i)
          nueva_jornada.fecha_fin = Date.new(fecha_fin[2].to_i, fecha_fin[1].to_i, fecha_fin[0].to_i)
          nueva_jornada.save
        elsif fecha_jornada.to_s.include? "("
          puts "entro 2"

          fechas = fecha_jornada.to_s[1..10].strip.split("/")

          nueva_jornada.fecha_inicio = Date.new(fechas[2].to_i, fechas[1].to_i, fechas[0].to_i)
          nueva_jornada.fecha_fin = Date.new(fechas[2].to_i, fechas[1].to_i, fechas[0].to_i)
          nueva_jornada.save
        else
          puts "entro 3"
          fecha_inicio = fechas[0].strip.split(".")
          nueva_jornada.fecha_inicio = Date.new(fecha_inicio[2].to_i, fecha_inicio[1].to_i, fecha_inicio[0].to_i)
          nueva_jornada.fecha_fin = Date.new(fecha_inicio[2].to_i, fecha_inicio[1].to_i, fecha_inicio[0].to_i)
          nueva_jornada.save
        end
      end
      liga_actual = Liga.find{|l| l.id == campeonato.liga_id.to_i}

      for j in 0..(cant_partidos-1)  #Recorro todos los partidos de la jornada i+1
        base_info_partido_xpath = partidos_xpath + "[#{j+1}]/"  #Base para el xpath a partir del cual se obtendran datos del partido j+1 de la jornada i+1
        equipo_local = liga.xpath(base_info_partido_xpath + "td[@class ='local']/span/text()")  #Obtiene el equipo local
        equipo_visitante = liga.xpath(base_info_partido_xpath + "td[@class ='visitante']/span/text()")  #Obtiene el equipo visitante
        resultado = liga.xpath(base_info_partido_xpath + "td[@class ='resultado']/text()")  #Obtiene el resultado


        puts "resultado #{resultado}"

        if (resultado.to_s.include?("-") && !(resultado.to_s == " ") && !(resultado.text == " "))
          puts "resultado entro |#{resultado}| algo"
          puts "jornada: #{i+1}"
          p = Partido.new
          p.marcador_local = resultado.to_s.split("-")[0].strip
          p.marcador_visitante = resultado.to_s.split("-")[1].strip
          p.jornada_id = nueva_jornada.id

          equipos_liga = Equipo.find_all_by_liga_id(liga_actual.id)

          #puts equipos_liga.find{|e| e.equipo_nombre == equipo_local.to_s}.equipo_nombre
          begin
            p.equipo_local_id = equipos_liga.find{|e| e.equipo_nombre == equipo_local.text}.id
            p.equipo_visitante_id = equipos_liga.find{|e| e.equipo_nombre == equipo_visitante.text}.id
            p.save
          rescue
          end
        end
      end
    end
  end

  def ligas_crawler(path, title, coll, bug)
    marcacom = Nokogiri::HTML(open(@html_page))
    #href ligas americanas
    ligaAmericaLinks = marcacom.xpath(path)
    #titulos ligas americanas
    ligaAmericaTitle = marcacom.xpath(title)

    ligas_funcionan = coll

    for nro_liga in ligas_funcionan

      ligaActual = Nokogiri::HTML(open(ligaAmericaLinks[nro_liga]))
      if !bug
        ligaActualNombre = ligaAmericaTitle[nro_liga]
      else
        ligaActualNombre = ligaAmericaTitle[nro_liga -1]
      end

      puts "Liga: #{ligaActualNombre}"

      cant =  ligaActual.xpath("//div[@class='archivo borde-caja']").size() #cantidad de campeonatos de una liga

      l = Liga.find_by_liga_nombre ligaActualNombre.to_s
      if l.nil?
        l = Liga.new();
        l.liga_nombre = ligaActualNombre.to_s
        l.save
      end
      #Para todos los campeonatos analzar la informacion
      for i in 0..(cant -1)
        temp = ligaActual.xpath("//div[@class='archivo borde-caja'][#{i+1}]/ul/li/small/a/@href")
        tempName = ligaActual.xpath("//div[@class='archivo borde-caja'][#{i+1}]/ul/li/small/a/text()")
        for j in 0..(temp.size()-1)
          #buscar si existe un campeonato tal que el nombre es temporada y conincide el id
          t = l.campeonatos.find_all{|c| c.nombre == "Temporada" && c.temporada_id == tempName[j].to_s}.first
          #si es nil busca si es de tipo apertura
          if t.nil?
            l.campeonatos.find_all{|c| c.nombre == "Apertura" && c.temporada_id == tempName[j].to_s}.first
          end
          #si es nil busca si es de tipo clausura
          if t.nil?
            l.campeonatos.find_all{|c| c.nombre == "Clausura" && c.temporada_id == tempName[j].to_s}.first
          end
          #si es nil entonces se crea
          if t.nil?
            t = Campeonato.new()
            if cant == 1
              t.nombre = "Temporada"
            elsif cant == 2 && i == 0
              t.nombre = "Apertura"
            else
              t.nombre = "Clausura"
            end
            #se asigna el id
            t.temporada_id = tempName[j].to_s
            t.liga = l;
            t.save
          end
          urlIndex = temp[j].to_s
          if ! (urlIndex.include? "www.marca.com"     )
            urlIndex = "http://www.marca.com" + urlIndex
          end
          begin
            equiposNoko = Nokogiri::HTML(open(urlIndex+"index.html"))
          rescue
            equiposNoko = Nokogiri::HTML(open(urlIndex))
          end
          equipos1 = equiposNoko.xpath("//div[@class = 'clasificacion']/table[@id ='clasificacion_completa']/tbody/tr/td[@class = 'equipo']/text()")
          equipos2 = equiposNoko.xpath("//table[@id='calsificacion_completa']/tbody/tr/td[@class = 'equipo']/text()")
          equipos = equipos1
          if equipos1.text == ""
            equipos = equipos2
          end
          equipos.each do |equipo|
            e = Equipo.find_by_equipo_nombre equipo.to_s
            if e.nil?
              e = Equipo.find_by_equipo_nombre equipo.text
            end
            if e.nil?
              e = Equipo.new()
              e.liga = l
              e.equipo_nombre = equipo.to_s
              e.liga_id = l.id
              e.save
              end
          end
          if (urlIndex.include?("index_nuevo.html"))
            urlIndex = urlIndex.sub("index_nuevo.html","")
          end
          crawler_America(t,urlIndex + "calendario.html")
        end
      end
    end
  end

  def liga_America
    marcacom = Nokogiri::HTML(open(@html_page))
    #href ligas americanas
    ligaAmericaLinks = marcacom.xpath("//ul[@class='submenu-americanas']/li/a/@href")
    #titulos ligas americanas
    ligaAmericaTitle = marcacom.xpath("//ul[@class='submenu-americanas']/li/a/@title")

    ligas_funcionan = [3, 5, 6, 7, 8, 10, 11, 12, 13]

    for nro_liga in ligas_funcionan

      ligaActual = Nokogiri::HTML(open(ligaAmericaLinks[nro_liga]))
      ligaActualNombre = ligaAmericaTitle[nro_liga] #OJOO!!!!!!!!!! Hardcode para que uruguay quede como la liga

      cant =  ligaActual.xpath("//div[@class='archivo borde-caja']").size() #cantidad de campeonatos de una liga

      l = Liga.find_by_liga_nombre ligaActualNombre.to_s
      if l.nil?
        l = Liga.new();
        l.liga_nombre = ligaActualNombre.to_s
        l.save
      end
      #Para todos los campeonatos analzar la informacion
      for i in 0..(cant -1)
        temp = ligaActual.xpath("//div[@class='archivo borde-caja'][#{i+1}]/ul/li/small/a/@href")
        tempName = ligaActual.xpath("//div[@class='archivo borde-caja'][#{i+1}]/ul/li/small/a/text()")
        for j in 0..(temp.size()-1)
          #buscar si existe un campeonato tal que el nombre es temporada y conincide el id
          t = l.campeonatos.find_all{|c| c.nombre == "Temporada" && c.temporada_id == tempName[j].to_s}.first
          #si es nil busca si es de tipo apertura
          if t.nil?
            l.campeonatos.find_all{|c| c.nombre == "Apertura" && c.temporada_id == tempName[j].to_s}.first
          end
          #si es nil busca si es de tipo clausura
          if t.nil?
            l.campeonatos.find_all{|c| c.nombre == "Clausura" && c.temporada_id == tempName[j].to_s}.first
          end
          #si es nil entonces se crea
          if t.nil?
            t = Campeonato.new()
            if cant == 1
              t.nombre = "Temporada"
            elsif cant == 2 && i == 0
              t.nombre = "Apertura"
            else
              t.nombre = "Clausura"
            end
            #se asigna el id
            t.temporada_id = tempName[j].to_s
            t.liga = l;
            t.save
          end
          urlIndex = temp[j].to_s
          if ! (urlIndex.include? "www.marca.com"     )
            urlIndex = "http://www.marca.com" + urlIndex
          end
          begin
            equiposNoko = Nokogiri::HTML(open(urlIndex+"index.html"))
          rescue
            equiposNoko = Nokogiri::HTML(open(urlIndex))
          end
          equipos1 = equiposNoko.xpath("//div[@class = 'clasificacion']/table[@id ='clasificacion_completa']/tbody/tr/td[@class = 'equipo']/text()")
          equipos2 = equiposNoko.xpath("//table[@id='calsificacion_completa']/tbody/tr/td[@class = 'equipo']/text()")
          equipos = equipos1
          if equipos1.text == ""
            equipos = equipos2
          end
          equipos.each do |equipo|
            e = Equipo.find_by_equipo_nombre equipo.to_s
            if e.nil?
              e = Equipo.find_by_equipo_nombre equipo.text
            end
            if e.nil?
              e = Equipo.new()
              e.liga = l
              e.equipo_nombre = equipo.to_s
              e.liga_id = l.id
              e.save
              end
          end
          if (urlIndex.include?("index_nuevo.html"))
            urlIndex = urlIndex.sub("index_nuevo.html","")
          end
          crawler_America(t,urlIndex + "calendario.html")
        end
      end
    end
  end

  def crawler_America (campeonato, urlCalendario)

    puts "Campeonato: #{campeonato.nombre} #{campeonato.temporada_id}"

    liga =  Nokogiri::HTML(open(urlCalendario))
    jornada_xpath = "//div[@class='jornada calendarioInternacional']"
    cant_jornadas = liga.xpath(jornada_xpath).size()  #Obtiene todas las jornadas de la liga
    for i in 0..(cant_jornadas-1) #Recorro todas las jornadas de la liga pasado por parametro
      partidos_xpath = "//div[@class='jornada calendarioInternacional'][#{i+1}]/table/tbody/tr"
      cant_partidos = liga.xpath(partidos_xpath).size() #Obtiene la cantidad de partidos de la jornada i

      fecha_jornada_xpath = "//div[@class='jornada calendarioInternacional'][#{i+1}]/table/thead/tr/th/text()"
      fecha_jornada = liga.xpath(fecha_jornada_xpath)  #Obtiene la fecha en que se jugo la jornada i+1

      if fecha_jornada.to_s == ""
        fecha_jornada = liga.xpath("//div[@class='jornada calendarioInternacional'][1]/table/thead/tr/th[@class = 'fnd2']/span/text()")  #Obtiene la fecha en que se jugo la jornada i+1
      end

      nueva_jornada = Jornada.find {|j| j.campeonato == campeonato && j.nro == i+1}

      if (nueva_jornada.nil?)
        nueva_jornada = Jornada.new
        nueva_jornada.campeonato = campeonato
        nueva_jornada.nro = i+1
        fechas = fecha_jornada.to_s.split("-")
        if fechas.size == 2
          fecha_inicio = fechas[0].strip.split(".")
          fecha_fin = fechas[1].strip.split(".")

          if (fecha_inicio.size < 2)
            fecha_inicio = fechas[0].strip.gsub('(','').gsub(')','').split("/")
            fecha_fin = fechas[1].strip.gsub('(','').gsub(')','').split("/")
          end

          nueva_jornada.fecha_inicio = Date.new(fecha_inicio[2].to_i, fecha_inicio[1].to_i, fecha_inicio[0].to_i)
          nueva_jornada.fecha_fin = Date.new(fecha_fin[2].to_i, fecha_fin[1].to_i, fecha_fin[0].to_i)
          nueva_jornada.save
        elsif fecha_jornada.to_s.include? "("

          fechas = fecha_jornada.to_s[1..10].strip.split("/")

          nueva_jornada.fecha_inicio = Date.new(fechas[2].to_i, fechas[1].to_i, fechas[0].to_i)
          nueva_jornada.fecha_fin = Date.new(fechas[2].to_i, fechas[1].to_i, fechas[0].to_i)
          nueva_jornada.save
        else
          fecha_inicio = fechas[0].strip.split(".")
          nueva_jornada.fecha_inicio = Date.new(fecha_inicio[2].to_i, fecha_inicio[1].to_i, fecha_inicio[0].to_i)
          nueva_jornada.fecha_fin = Date.new(fecha_inicio[2].to_i, fecha_inicio[1].to_i, fecha_inicio[0].to_i)
          nueva_jornada.save
        end
      end
      liga_actual = Liga.find{|l| l.id == campeonato.liga_id.to_i}

      for j in 0..(cant_partidos-1)  #Recorro todos los partidos de la jornada i+1
        base_info_partido_xpath = partidos_xpath + "[#{j+1}]/"  #Base para el xpath a partir del cual se obtendran datos del partido j+1 de la jornada i+1
        equipo_local = liga.xpath(base_info_partido_xpath + "td[@class ='local']/span/text()")  #Obtiene el equipo local
        equipo_visitante = liga.xpath(base_info_partido_xpath + "td[@class ='visitante']/span/text()")  #Obtiene el equipo visitante
        resultado = liga.xpath(base_info_partido_xpath + "td[@class ='resultado']/text()")  #Obtiene el resultado

        if (resultado.to_s.include?("-") && !(resultado.to_s == " ") && !(resultado.text == " "))
          p = Partido.new
          p.marcador_local = resultado.to_s.split("-")[0].strip
          p.marcador_visitante = resultado.to_s.split("-")[1].strip
          p.jornada_id = nueva_jornada.id

          equipos_liga = Equipo.find_all_by_liga_id(liga_actual.id)

          begin
            p.equipo_local_id = equipos_liga.find{|e| e.equipo_nombre == equipo_local.text}.id
            p.equipo_visitante_id = equipos_liga.find{|e| e.equipo_nombre == equipo_visitante.text}.id
            p.save
          rescue
          end
        end
      end
    end
  end
end

